package com.hbnulk.gui;

import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;

public class GameJFrame extends JFrame implements KeyListener, ActionListener {
    int[][] tempArr = new int[4][4];

    String path = ".\\素材\\image\\animal\\animal1\\";

    int x = 0;
    int y = 0;
    //统计步数
    int step = 0;
    //创建选项下面的条目对象
    JMenuItem rePlayItem = new JMenuItem("重新游戏");
    JMenuItem reLoginItem = new JMenuItem("重新登录");
    JMenuItem closeGameItem = new JMenuItem("关闭游戏");

    JMenuItem accountItem = new JMenuItem("公众号");
    JMenuItem beautifulGrilItem = new JMenuItem("美女");
    JMenuItem animalItem = new JMenuItem("动物");
    JMenuItem sportItem = new JMenuItem("运动");

    //设置初始化随机种子
    Random random = new Random();

    //游戏的主界面
    public GameJFrame(){

        //初始化界面
        InitJFrame();

        //初始化菜单
        InitJMenuBar();

        //初始化数据
        InitDate();

        //初始化图片
        InitImage();

        //让界面显示出来
        this.setVisible(true);
    }

    private void InitDate() {
        int[] arr = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
        Random random = new Random();

        for (int i = 0; i < arr.length; i++) {

            //随机获取0-arr.length之间的索引
            int index = random.nextInt(arr.length);
            int temp = arr[i];
            arr[i] = arr[index];
            arr[index] = temp;
        }

        for (int i = 0; i < arr.length; i++) {
            //记录空白图片在二维数组中的位置
            if(arr[i] == 0){
                x = i / 4;
                y = i % 4;
            }
            tempArr[i / 4][i % 4] = arr[i];
        }

    }

    private void InitImage() {

        //清空原本已经出现的所有图片
        this.getContentPane().removeAll();

        if(victory()){
            //通关的话显示胜利的图片
            JLabel winJlabel = new JLabel(new ImageIcon(".\\素材\\image\\win.png"));
            winJlabel.setBounds(243,283,197,73);
            this.getContentPane().add(winJlabel);
        }
        for (int j = 0; j < 4; j++) {
            for (int i = 0; i < 4; i++) {
                int num = tempArr[j][i];
                //创建一个图片ImageIcon的对象
                ImageIcon icon = new ImageIcon(path + num +".jpg");
                //创建一个JLabel的对象（管理容器）,用于添加图片
                JLabel jLabel1 = new JLabel(icon);
                //指定图片位置
                jLabel1.setBounds(105 * i + 123, 105 * j + 134,105,105);
                //给图片添加边框
                //LOWERED将图片凹陷下去
                jLabel1.setBorder(new BevelBorder(BevelBorder.LOWERED));

                //将管理容器添加到界面当中
                //this.add(jLabel1);
                this.getContentPane().add(jLabel1);
                //每次放置一个图片之后，number++，表示走到后一张图片
            }
        }

        //统计步数
        JLabel stepJlabel = new JLabel(new String("步数:" + step));
        //指定”步数“的位置
        stepJlabel.setBounds(80,30,100,20);
        this.getContentPane().add(stepJlabel);


        //添加背景图片
        JLabel background = new JLabel(new ImageIcon(".\\素材\\image\\background.png"));
        //指定图片位置
        background.setBounds(80,40,508,560);
        //将管理容器添加到界面当中
        this.getContentPane().add(background);


        //刷新界面
        this.getContentPane().repaint();
    }

    private void InitJMenuBar() {
        //初始化菜单
        JMenuBar jMenuBar = new JMenuBar();

        //创建菜单上两个选项的对象("功能" "关于我们")
        JMenu functionJMenu = new JMenu("功能");
        JMenu aboutJMenu  = new JMenu("关于我们");
        JMenu changeImg = new JMenu("更换图片");


        ////将条目插入"更换图片"选项
        changeImg.add(beautifulGrilItem);
        changeImg.add(animalItem);
        changeImg.add(sportItem);


        //将条目插入"功能"选项
        functionJMenu.add(changeImg);
        functionJMenu.add(rePlayItem);
        functionJMenu.add(reLoginItem);
        functionJMenu.add(closeGameItem);


        //将条目插入 关于我们 选项
        aboutJMenu.add(accountItem);

        //将两个选项插入菜单栏当中
        jMenuBar.add(functionJMenu);
        jMenuBar.add(aboutJMenu);

        //为条目对象绑定事件
        rePlayItem.addActionListener(this);
        reLoginItem.addActionListener(this);
        closeGameItem.addActionListener(this);
        accountItem.addActionListener(this);

        beautifulGrilItem.addActionListener(this);
        animalItem.addActionListener(this);
        sportItem.addActionListener(this);

        //给主界面设置菜单
        this.setJMenuBar(jMenuBar);
    }

    private void InitJFrame() {
        //设置界面的宽高
        this.setSize(703, 780);
        //设置界面的标题
        this.setTitle("拼图单机版 v1.0");
        //让界面置顶
        this.setAlwaysOnTop(true);
        //让界面居中
        this.setLocationRelativeTo(null);
        //设置关闭模式
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        //取消隐藏容器中默认的居中设置,只有取消了才能按照数轴XY形式进行添加组件
        this.setLayout(null);

        //给窗体添加键盘监听
        this.addKeyListener(this);
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    //键盘按下不松调用这个方法
    @Override
    public void keyPressed(KeyEvent e) {
        int keyCode = e.getKeyCode();
        if(keyCode == 65){
            //清空原本已经出现的所有图片
            this.getContentPane().removeAll();

            //添加完整的图片
            JLabel all = new JLabel(new ImageIcon("D:\\code\\javaSE\\puzzle_game\\素材\\image\\animal\\animal1\\all.jpg"));
            //设置管理容器在窗体中的位置
            all.setBounds(123,134, 420,420);
            //把管理容器添加到界面当中
            this.getContentPane().add(all);

            //添加背景图片
            //添加背景图片
            JLabel background = new JLabel(new ImageIcon("D:\\code\\javaSE\\puzzle_game\\素材\\image\\background.png"));
            //指定图片位置
            background.setBounds(80,40,508,560);
            //将管理容器添加到界面当中
            this.getContentPane().add(background);

            //刷新界面
            this.getContentPane().repaint();

        }


    }

    //键盘按下松开调用这个方法
    @Override
    public void keyReleased(KeyEvent e) {
        //如果游戏通关了，就不需要继续走了
        if(victory()){
            return;
        }
        //对上下左右进行判断
        //左37 上38 右39 下40
        int keyCode = e.getKeyCode();
        if(keyCode == 37){
            System.out.println("向左移动");

            if(y == 3){
                //空白块在最右侧，无法再次进行左移
                return;
            }
            //把空白块右方数字往左移动
            //x,y 表示空白方块
            //x,y + 1 表示空白方块右方的数字
            tempArr[x][y] = tempArr[x][y + 1];
            tempArr[x][y + 1] = 0;
            y++;
            step++;
            //按照最新的数字去加载图片
            InitImage();

        }
        else if(keyCode == 38){
            System.out.println("向上移动");
            if(x == 3){
                //空白块在最下侧，无法再次进行上移
                return;
            }
            //把空白块下方数字往上移动
            //x,y 表示空白方块
            //x + 1,y 表示空白方块下方的数字
            tempArr[x][y] = tempArr[x + 1][y];
            tempArr[x + 1][y] = 0;
            x++;
            step++;
            //按照最新的数字去加载图片
            InitImage();
        }else if(keyCode == 39){
            System.out.println("向右移动");
            if(y == 0){
                //空白块在最左侧，无法再次进行右移
                return;
            }
            //把空白块左方数字往右移动
            //x,y 表示空白方块
            //x,y - 1 表示空白方块左方的数字
            tempArr[x][y] = tempArr[x][y - 1];
            tempArr[x][y - 1] = 0;
            y--;
            step++;
            //按照最新的数字去加载图片
            InitImage();

        }else if(keyCode == 40){
            System.out.println("向下移动");
            if(x == 0){
                //空白块在最上侧，无法再次进行下移
                return;
            }

            //把空白块上方数字往下移动
            //x,y 表示空白方块
            //x - 1,y 表示空白方块上方的数字
            tempArr[x][y] = tempArr[x - 1][y];
            tempArr[x - 1][y] = 0;
            x--;
            step++;
            //按照最新的数字去加载图片
            InitImage();

        }else if(keyCode == 65){
            //松开A时，需要重新加载图片
            InitImage();
        }else if(keyCode == 87){
            //按W键后 一键通关
            tempArr = new int[][]{
                    {1,2,3,4},
                    {5,6,7,8},
                    {9,10,11,12},
                    {13,14,15,0}
            };
            InitImage();
        }
    }

    //判断游戏是否通关，并取得胜利
    public boolean victory(){
        int win[][] = new int[][]{
                {1,2,3,4},
                {5,6,7,8},
                {9,10,11,12},
                {13,14,15,0}
        };
        for (int i = 0; i < tempArr.length; i++) {
            for (int j = 0; j < tempArr[i].length; j++) {
                if(tempArr[i][j] != win[i][j]){
                    return false;
                }
            }
        }
        return true;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        //获得被点击的对象
        Object source = e.getSource();
        if(source == rePlayItem){
            System.out.println("重新游戏");
            //1.步数置为0
            step = 0;
            //2.打乱二维数组中的数据
            InitDate();
            //3.重新加载图片
            InitImage();

        }else if(source == reLoginItem){
            System.out.println("重新登录");
            //关闭当前游戏界面
            this.setVisible(false);
            //打开登录界面
            new LoginJFrame();
        }else if(source == closeGameItem){
            System.out.println("关闭游戏");
            System.exit(0);
        }else if(source == accountItem){
            System.out.println("公众号");

            //创建一个弹框对象
            JDialog jDialog = new JDialog();
            ImageIcon account = new ImageIcon(".\\素材\\image\\about.png");
            //创建一个容器管理图片
            JLabel jLabel = new JLabel(account);
            //设置位置与宽高
            jLabel.setBounds(0, 0, 258,258);
            //把图片添加到弹框当中
            jDialog.getContentPane().add(jLabel);
            //给弹框设置大小
            jDialog.setSize(344,344);
            //让弹框置顶
            jDialog.setAlwaysOnTop(true);
            //让弹框居中
            jDialog.setLocationRelativeTo(null);
            //设置弹框不关闭则无法操作游戏界面
            jDialog.setModal(true);
            //让弹框显示出来
            jDialog.setVisible(true);
        }else if(source == beautifulGrilItem){
            //1.随机选择图片
            int randomImage = random.nextInt(12) + 1;
            //修改path记录的值
            path  = ".\\素材\\image\\girl\\girl" + randomImage + "\\";
            //步数归0
            step = 0;

            //2.打乱二维数组中的数据
            InitDate();
            //3.重新加载图片
            InitImage();

        }else if(source == animalItem){
            //1.随机选择图片
            int randomImage = random.nextInt(7) + 1;
            //修改path记录的值
            path  = ".\\素材\\image\\animal\\animal" + randomImage + "\\";
            //步数归0
            step = 0;

            //2.打乱二维数组中的数据
            InitDate();
            //3.重新加载图片
            InitImage();

        }else if(source == sportItem){
            //1.随机选择图片
            int randomImage = random.nextInt(9) + 1;
            //修改path记录的值
            path  = ".\\素材\\image\\sport\\sport" + randomImage + "\\";
            //步数归0
            step = 0;

            //2.打乱二维数组中的数据
            InitDate();
            //3.重新加载图片
            InitImage();
        }
    }
}
